/**
 * ZFounder.com Inc.
 * Copyright (c) 2013-2066 All Rights Reserved.
 */
package com.superjson.showpro.shared.result;

import org.apache.commons.lang3.StringUtils;

import static com.beantools.util.ObjectUtil.isNull;
import static com.superjson.showpro.shared.result.ResultCodeEnum.INTERNAL_ERROR;

/**
 * @author Jonathan.Jin
 * @version $Id: ResultUtil.java, v 0.1 2017/3/28 22:27 Jonathan.Jin Exp $
 */
public class ResultUtil {

    private ResultUtil() {
    }

    /**
     * 构建成功结果对象
     *
     * @param t
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildSuccess(T t) {
        return new Result<T>(true, t);
    }

    /**
     * 构建成功结果对象
     *
     * @return
     */
    public static <T> Result buildSuccess() {
        return new Result<T>(true);
    }

    /**
     * 构建操作失败对象
     *
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildGenericFailed() {
        return new Result<T>(false, INTERNAL_ERROR.getCode(), "操作失败，请联系管理员");
    }

    /**
     * 构建操作失败对象
     *
     * @param errorMsg
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildGenericFailed(final String errorMsg) {
        return new Result<T>(false, INTERNAL_ERROR.getCode(), errorMsg);
    }

    /**
     * 构建操作失败对象
     *
     * @param resultCodeEnum 错误的结果枚举
     * @param errorMsg       如果为空，则使用当前错误枚举对象的默认消息
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildFailed(final BaseResultCodeEnum resultCodeEnum, final String errorMsg) {
        return new Result<>(false, resultCodeEnum.getCode(), StringUtils.isBlank(errorMsg) ? resultCodeEnum.getDesc() : errorMsg);
    }

    /**
     * 构建操作失败对象
     *
     * @param errorMsg 如果为空，则使用当前错误枚举对象的默认消息
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildFailed(final String errorMsg) {
        return new Result<>(false, null, errorMsg);
    }

    /**
     * 构建操作失败对象
     *
     * @param resultCodeEnum 错误的结果枚举
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildFailed(final BaseResultCodeEnum resultCodeEnum) {
        return new Result<>(false, resultCodeEnum.getCode(), resultCodeEnum.getDesc());
    }

    /**
     * 构建操作失败对象
     *
     * @param re
     * @param <T>
     * @return
     */
    public static <T> Result<T> buildFailed(final Exception re) {
        return new Result<>(false, INTERNAL_ERROR.getCode(), re.getLocalizedMessage());
    }

    /**
     * 根据对象构建统一的结果
     * 对于null对象，统一使用记录不存在错误信息
     *
     * @param t
     * @return
     */
    public static <T> Result<T> buildResult(final T t) {
        if (t == null) {
            return new Result<>(false, INTERNAL_ERROR.getCode(), "记录不存在");
        } else {
            return new Result<T>(true, t);
        }
    }

}
